package org.jeecg.modules.demo.flowable.service;

import org.jeecg.modules.demo.flowable.model.*;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 * 流程处理通用方法
 *
 * @Author YuXD
 * @Version 1.0
 * @since 2022/4/16
 */
public interface ICommonFlowableProcess {

    /**
     * 检查某任务是否属于某个处理人
     *
     * @param taskId   任务ID
     * @param assignee 处理人
     * @return 如果是返回true, 否则返回false
     */
    boolean checkTaskBelongToAssignee(String taskId, String assignee);

    /**
     * 创建一个流程实例，创建实例时会登记一些信息，这些信息可以通过调用
     * queryProcessVariables方法获取到，调用时需要传递processInstanceId
     *
     * @param flowParam
     * @return
     */
    ProcessInstanceEntity startProcess(ProcessParam flowParam);

    /**
     * 获取指定工作人某种流程类型的代办任务
     *
     * @param flowableType 流程类型
     * @param assignee
     * @return
     */
//    List<TaskInstanceEntity> activeTaskInstance(String assignee, String processInstanceId, FlowableDefinitionEnum flowableType);

    /**
     * 获取指定工作人某种流程类型的已完成的任务
     *
     * @param flowableType 流程类型
     * @param assignee
     * @return
     */
//    List<TaskInstanceEntity> finishedTaskInstance(String assignee, String processInstanceId, FlowableDefinitionEnum flowableType);

    /**
     * 根据任务ID查询任务信息
     *
     * @param taskId 任务ID
     * @return
     */
    TaskInstanceEntity queryTaskById(String taskId);

    /**
     * 查询指定流程所有任务，包括历史任务和执行中任务
     *
     * @param processInstanceId 流程实例ID
     * @param assignee          任务处理人
     * @param taskType          任务类别：HISTORY(历史任务) CURRENT(当前执行中任务)，为空时表示返回所有
     * @return
     */
    List<TaskInstanceEntity> queryTaskByProcessInstanceId(String processInstanceId, String assignee, String taskType);

    /**
     * 处理工作
     *
     * @param flowParam
     */
    void handleTask(ProcessParam flowParam);

    /**
     * 获取某个流程实体的状态，各个审批环节所处的状态信息
     *
     * @param processInstanceId
     * @return
     */
    List<ProcessStatusEntity> queryProcessStatus(String processInstanceId);

    /**
     * 查看创建流程实例时登记的变量信息
     *
     * @param processInstanceId
     * @return
     */
    Map<String, Object> queryProcessVariables(String processInstanceId);

    /**
     * 获取某人的历史审批数据
     *
     * @param assignee
     * @return
     */
    List<HistanceInstanceEntity> queryHistoryProcess(String assignee);

    /**
     * 生成流程的图谱
     *
     * @param httpServletResponse
     * @param processInstanceId
     */
    void genProcessDiagram(HttpServletResponse httpServletResponse, String processInstanceId) throws Exception;

    /**
     * 查询是否存在历史数据的流程实例
     *
     * @param processInstanceId
     * @return
     */
    boolean isExistHistoricProcessInstance(String processInstanceId);

    /**
     * 查询指定的流程是否是运行中的流程
     *
     * @param processInstanceId
     * @return
     */
    boolean isExistRunningProcessInstance(String processInstanceId);

    /**
     * 将指定的流程挂起
     *
     * @param processInstanceId
     */
    void suspendProcessInstance(String processInstanceId);

    /**
     * 终止项目流程
     *
     * @param flowParam
     */
    void terminateProcessInstance(ProcessParam flowParam);

    /**
     * 将指定的流程激活
     *
     * @param processInstanceId
     */
    void activateProcessInstance(String processInstanceId);

    /**
     * 删除流程实例
     *
     * @param flowParam
     */
    void deleteProcessInstance(ProcessParam flowParam);

    /**
     * 将任务返回到某一步骤
     *
     * @param taskId
     * @param targetTaskKey 返回到的目标任务ID
     */
    void rollbackTask(String taskId, String targetTaskKey);

    boolean isProcessFinished(String processInstanceId);
}
